/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.seminariosab.tools;

import com.seminariosab.SABObject;
import com.seminariosab.entys.SABCallsEnty;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.*;

/**
 *
 * @author Administrador
 */
public class SABUtil extends SABObject {
    
    public SABUtil(){
        super();
    }
    
    /**
    * Lista los archivos GSM /MP3 que contiene el directorio de grabaciones (ASTERISK)
    * @param path - String - Cadena que representa la ubicacion de las grabaciones.
    * @return Collection<File> - Lista generica de tipo File que contiene todos los registros de llamadas.
    */  
    public Collection<File> listFiles(String path){        
        File f=null;
        Collection<File> c=null;
        try {
            c=FileUtils.listFiles(new File(path), new String[]{"mp3","gsm"}, true);
        } catch (Exception e) {
            System.out.println(""+e.toString());
        }
        return c;
    }
    

    /**
     * Busca un separador "-" de el parámetro enviado. Obtiene un arreglo con la estrucutra {e100,14272975,22112012,101603.gsm} 
     * @param strAbsoluteName
     * @return String[]={'','','',''}
     */
    public String[] buildGrabationStructure(String strAbsoluteName){
        String splittedStr[] = null;
        String pattern1="\\-";
        splittedStr=( (strAbsoluteName.split(pattern1)).length > 0 ? (strAbsoluteName.split(pattern1)) : (null) );
        splittedStr[0]=getRegCallAnexo(splittedStr[0]);
        splittedStr[2]=getRegCallDate(splittedStr[2]);
        splittedStr[3]=getRegCallHour(splittedStr[3]);
        return splittedStr;
    }
    
    /**
     * Busca un separador "-" de el parámetro enviado. Obtiene un arreglo con la estrucutra {e100,14272975,22112012,101603.gsm} 
     * @param strAbsoluteName
     * @return String[]={'','','',''}
     */
    public String[] buildGrabationStructurePart2(String strAbsolutePath, String strAbsoluteName){
        String e_s=this.getRegCallEntranteSaliente(strAbsoluteName);
        //SABCAllsEnty: cod_operador,fg_verificada,fg_enviar_smv,nombrearchivo,url,cosabval,descripcion,cliente,compra_venta
        String splittedStr[] = {e_s,"","",strAbsoluteName,strAbsolutePath,"","","",""}; 
        return splittedStr;
    }
    
    
    public String getRegCallDate(String dateDDMMYY){
        String dateDD_MM_YYYY=null;
        String subDD="",subMM="",subYYYY="";
        subDD=dateDDMMYY.substring(0, 2);
        subMM=dateDDMMYY.substring(2, 4);
        subYYYY=dateDDMMYY.substring(4, 8);
        dateDD_MM_YYYY=subDD+"-"+subMM+"-"+subYYYY;
        return dateDD_MM_YYYY;
    }
    
    public String getRegCallHour(String dateHHMMSS){
        String dateHH_MM_SS=null;
        String sub_hh="",sub_mm="",sub_ss="";
        sub_hh=dateHHMMSS.substring(0, 2);
        sub_mm=dateHHMMSS.substring(2, 4);
        sub_ss=dateHHMMSS.substring(4, 6);
        dateHH_MM_SS=sub_hh+":"+sub_mm+":"+sub_ss;
        return dateHH_MM_SS;
    }
    
    public String getRegCallAnexo(String anxEXXX){
        String anexXXX=null;
        String sub_e="",sub_anx="";
        sub_e=anxEXXX.substring(0, 1);
        sub_anx=anxEXXX.substring(1);
        anexXXX=sub_anx;
        return anexXXX;
    }
    
    public String getRegCallEntranteSaliente(String anxEXXX){
        String anexXXX=null;        
        anexXXX=((anxEXXX.startsWith("e")==true)?"Entrante":"Saliente");
        return anexXXX;
    }
    
    /**
     * 
     * @param strdate
     * @return 
     */
    public String[] splitDate(String strdate){
        String splittedStr[] = null;
        String pattern1="/",pattern2="-"; /* dd/MM/yyyy dd-MM-yyyy */
        splittedStr=( (strdate.split(pattern1)).length > 0 ? (strdate.split(pattern1)) : (strdate.split(pattern2)) );
        return splittedStr;
    }
    
    /**
     * Da el formato de dia/mes/año según el calendario local. Se vale del parámetro enviado como cadena.
     * @param strdate - String - Cadena de texto que representa una fecha válida.
     * @return String - cadena que representa la fecha formateada
     */
    public Date formatDate(String strdate){
        Date formatoFecha=null;
        SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyyy", Locale.getDefault());
        try {
            formatoFecha=sdf.parse(strdate);            
        } catch (ParseException ex) {
            System.out.println("Method formatDate(String strdate): "+ex.toString());
        }
        
        return formatoFecha;
    }
    
    /**
     * Identifica si la llamada fue entrante o saliente. Verifica el primer caracter del nombre del archivo : e=ENTRANTE, s=SALIENTE
     * @param filename - String - Cadena que representa el nombre del archivo
     * @return String - Cadena : ENTRANTE / SALIENTE
     */
    public String siEntranteSaliente(String filename){
        String entranteSaliente="";
        if(filename.startsWith("s")){entranteSaliente="Saliente";}else if(filename.startsWith("e")){entranteSaliente="Entrante";}else{entranteSaliente="NA";}        
        return entranteSaliente;
    }
    
    /**
     * Lista los directorios contenidos en un directorio padre. Asi si tenemos: /tmp/ listara los directoroios (solamente)
     * contenidos. la busqueda solo es de nivel 1 , por tanto no es recursiva.
     * @param dadPath - String - Cadena que contiene la ruta completa al directorio donde se buscara (listar) los directorios hijo
     * @return - String[] - Arreglo de cadena que contiene cada directorio hijo
     */
    public String[] getFoldersNonRecursiveByPath(String dadPath){
        
        
        String[] arrFolders=new File(dadPath).list();        
        if(arrFolders!=null){            
            for (String str : arrFolders) {
                int i=0;
                if((new File(str)).isDirectory()) arrFolders[i]=str;
                i++;
            }
        }
        return arrFolders;
    }
    
    /**
     * 
     * @param vPath
     * @return 
     */
    public String[] getFoldersRecursiveByPath(String vPath){
       java.util.List<java.io.File> lstF=(java.util.List<java.io.File>)FileUtils.listFilesAndDirs(new java.io.File(vPath), FalseFileFilter.FALSE, FileFilterUtils.directoryFileFilter());
        int co=0;
        String[] strPath=new String[lstF.size()];
        for (File file : lstF) {            
            try {
                strPath[co]=file.getCanonicalPath();
                co++;
            } catch (IOException ex) {
                System.out.println(TestClassDevSAb2.class.getName()+": "+ex.toString());
            }
        }
        return strPath;
    }
}
